import HotZone from "../graphic/hot-zone";

/**
 * 通用触发器
 */
export default class NormalHotZone extends HotZone{
    constructor(values={}){
        super(values);
    }

    /**
     * 中心圈半径
     */
    set radius(val){
        this.material.uniforms.radius={value:val};
    }
    initVariable(){
        super.initVariable();
    }
    initMaterial(){
        super.initMaterial();
        this.material.uniforms.radius={value:1};
    }

    /**
     * 重写片元着色器
     */
    get fragmentShader(){
        return [
            '#define PI 3.1415926' ,
            'uniform float opacity;' ,
            'uniform float time;' ,
            'uniform vec3 color;' ,
            'uniform float radius;' ,
            'varying vec2 vuv;' ,
            'float d=0.;' ,
            'vec3 cent_color=vec3(0.8,0.8,0.8);' ,
            'vec3 bg_color=vec3(0.);' ,
            'float drawCircle(float radius,float thick){' ,
            '   float l= distance(vuv,vec2(0.5));' ,
            '   float a=abs(radius-l)/thick;' ,
            '   return 1.-clamp(a,0.,1.);' ,
            '}',
            'void main(){' ,
            '   vec3 colY=vec3(0.);' ,
            '   vec3 colW=vec3(0.);' ,
            '   vec4 fColW=vec4(0.);' ,
            '   vec4 fColY=vec4(0.);' ,
            '   vec4 fColA=vec4(0.);' ,
            '   float a=0.;',

            '   d=drawCircle(0.2*radius,0.04);' ,
            '   colY=cent_color*clamp(sin(d)*2.,0.,1.);' ,
            '   if(colY.x+colY.y+colY.z>0.1)a=-1.;' ,
            '   if(a!=-1.){' ,
            '      d=drawCircle(0.,0.13);' ,
            '      colW=color*clamp(sin(d)*2.,0.,1.);' ,
            '   }' ,
            '   if(colW.x+colW.y+colW.z>0.1)a=-2.;' ,
            '   vec3 fCol=vec3(0.);' ,
            '   if(a==-1.){' ,
            '      fColY=vec4(colY,1.);' ,
            '   }else if(a==-2.){',
            '      fColW=vec4(colW,1.);' ,
            '   }' ,
            '   vec2 tuv=(vuv-.5);' ,
            '   float dis=length(tuv);' ,
            '   float md=mod(dis-time,0.17)*10.;' ,
            '   float ad=0.5-dis;' ,
            '   float alpha=ad*md+ad;' ,
            '   fColA=vec4(bg_color,alpha*1.);' ,
            '   fCol=fColY.rgb+fColW.rgb+fColA.rgb;',
            '   float fA=(fColY.a+fColW.a)*0.8+fColA.a;',

            '   gl_FragColor=vec4(fCol*fA*opacity,fA);',
            '}'
        ].join('\n');
    }
}